using System.IO;
using UnityEngine;
using System.Collections.Generic;
using Newtonsoft.Json;

public class DataManager
{
    public static GameData gameData = new GameData();

    public static string savePath = Path.Combine(Application.persistentDataPath, "saveData.json");


    // 加密：选择一些用于亦或操作的字符（注意保密）
    public static char[] keyChars = { 'a', 'b', 'c', 'd', 'e' };

    // 加密方法
    public static string Encrypt(string data)
    {
        char[] dataChars = data.ToCharArray();
        for (int i = 0; i < dataChars.Length; i++)
        {
            char dataChar = dataChars[i];
            char keyChar = keyChars[i % keyChars.Length];
            // 重点： 通过亦或得到新的字符
            char newChar = (char)(dataChar ^ keyChar);
            dataChars[i] = newChar;
        }
        return new string(dataChars);
    }

    // 解密方法
    public static string Decrypt(string data)
    {
        return Encrypt(data);
    }

    //加载用户数据
    public static GameData Load()
    {
        Debug.Log(savePath);
        // 检查用户配置文件是否存在
        if (File.Exists(savePath))
        {
            // 从文本文件中加载JSON字符串
            string jsonData = File.ReadAllText(savePath);
            // #if UNITY_EDITOR
            //             // 加密5
            //             jsonData = Decrypt(jsonData);
            // #endif
            // 将JSON字符串转换为用户内存数据
            gameData = JsonConvert.DeserializeObject<GameData>(jsonData);
           
            Debug.Log("加载成功");
            return gameData;
        }
        else
        {
            Debug.Log("无数据");
            return null;
        }
    }

    // 保存用户数据
    public static void SaveUserData(UserData userData)
    {
        gameData.usersData[userData.name] = userData;
        // 转换用户数据为JSON字符串
        // string jsonData = JsonUtility.ToJson(gameData);
         string jsonData = JsonConvert.SerializeObject(gameData);
        // #if UNITY_EDITOR
        //         // 加密4
        //         jsonData = Encrypt(jsonData);
        // #endif
        File.WriteAllText(savePath, jsonData);
        UserEvents.UserList();
        Debug.Log("保存成功");
    }

    // 读取用户数据
    public static UserData LoadUserData(string userName)
    {
        // 率先从缓存中取数据，而不是从文本文件中读取
        if (gameData.usersData.ContainsKey(userName))
        {
            return gameData.usersData[userName];
        }
        Load();
        return gameData.usersData[userName]; ;
    }

    //删除用户
    public static bool ClearUserData(string userName)
    {
        if (gameData.usersData.ContainsKey(userName))
        {
            gameData.usersData.Remove(userName);
        }else{
            Load();
            gameData.usersData.Remove(userName);
        }
        string jsonData = JsonConvert.SerializeObject(gameData);
        // #if UNITY_EDITOR
        //         // 加密4
        //         jsonData = Encrypt(jsonData);
        // #endif
        File.WriteAllText(savePath, jsonData);
        // 触发事件
        UserEvents.UserList();
        return true;

    }

    // 保存当前用户
    public static void SaveClientData(ClientData data)
    {
        gameData.clientData = data;

        // 转换用户数据为JSON字符串
        string jsonData = JsonConvert.SerializeObject(gameData);
        // #if UNITY_EDITOR
        //         // 加密4
        //         jsonData = Encrypt(jsonData);
        // #endif
        File.WriteAllText(savePath, jsonData);
        // 触发事件
        UserEvents.UserClient(data);
    }

    // 读取当前用户
    public static ClientData LoadClientData()
    {
        if (gameData.clientData != null)
        {
            return gameData.clientData;
        }
        //  率先从缓存中取数据，而不是从文本文件中读取
        Load(); 
        return gameData.clientData;
    }
}

public class GameData
{
    public Dictionary<string, UserData> usersData = new Dictionary<string, UserData>();
    public ClientData clientData;
}

public class UserData
{
    public string name;
    public int level;
    public UserData(string name, int level)
    {
        this.name = name;
        this.level = level;
    }
}

public class ClientData
{
    public string curUserName = "";
    public ClientData(string curUserName)
    {
        this.curUserName = curUserName;
    }
}